package com.fsserver.core.service;

import com.fsserver.core.dto.PaymentRequestDTO;
import com.fsserver.core.dto.RefundRequestDTO;
import com.fsserver.core.vo.PaymentResponseVO;
import com.fsserver.core.vo.RequestNotification;

import java.util.Map;

/**
 * 统一支付网关服务接口
 * Unified Payment Gateway Service
 *
 * @author fsserver
 */
public interface PaymentGatewayService {

    /**
     * 支付渠道：微信支付
     */
    String CHANNEL_WECHAT = "WECHAT";

    /**
     * 支付渠道：支付宝支付
     */
    String CHANNEL_ALIPAY = "ALIPAY";

    /**
     * 创建支付
     * Create payment
     *
     * @param requestDTO 支付请求DTO
     * @return 支付响应VO
     */
    PaymentResponseVO createPayment(PaymentRequestDTO requestDTO);

    /**
     * 查询订单
     * Query order
     *
     * @param orderNo 订单号
     * @param paymentChannel 支付渠道（WECHAT、ALIPAY）
     * @return 订单信息
     */
    Map<String, Object> queryOrder(String orderNo, String paymentChannel);

    /**
     * 关闭订单
     * Close order
     *
     * @param orderNo 订单号
     * @param paymentChannel 支付渠道（WECHAT、ALIPAY）
     * @return 是否成功
     */
    boolean closeOrder(String orderNo, String paymentChannel);

    /**
     * 申请退款
     * Apply refund
     *
     * @param orderNo 订单号
     * @param refundNo 退款单号
     * @param totalAmount 订单总金额（单位：分）
     * @param refundAmount 退款金额（单位：分）
     * @param reason 退款原因
     * @param paymentChannel 支付渠道（WECHAT、ALIPAY）
     * @return 退款结果
     */
    Map<String, Object> refund(String orderNo, String refundNo, Long totalAmount, Long refundAmount, String reason, String paymentChannel);

    /**
     * 申请退款（使用统一的RefundRequestDTO）
     * Apply refund with unified RefundRequestDTO
     *
     * @param refundRequestDTO 退款请求DTO
     * @param paymentChannel 支付渠道（WECHAT、ALIPAY）
     * @return 退款结果
     */
    Map<String, Object> refund(RefundRequestDTO refundRequestDTO, String paymentChannel);

    /**
     * 查询退款
     * Query refund
     *
     * @param refundNo 退款单号
     * @param paymentChannel 支付渠道（WECHAT、ALIPAY）
     * @return 退款信息
     */
    Map<String, Object> queryRefund(String refundNo, String paymentChannel);

    /**
     * 处理支付通知
     * Handle payment notification
     *
     * @param notification 通知对象
     * @return 是否处理成功
     */
    boolean handlePaymentNotification(RequestNotification notification);

    /**
     * 处理退款通知
     * Handle refund notification
     *
     * @param notification 通知对象
     * @return 是否处理成功
     */
    boolean handleRefundNotification(RequestNotification notification);
} 